##
# Region 是中国行政区划。
# 《GB/T 2260-2007 中华人民共和国行政区划代码》
# 数字码采用三层六位层次码结构，按层次分别表示我国各
#   省（自治区，直辖市，特别行政区）、
#   市（地区，自治州，盟）、
#   县（自治县、县级市、旗、自治旗、市辖区、林区、特区）。
#   第1、2位数字：所在省份编码，表示省、自治区、直辖市、特别行政区。
#   第3、4位数字：所在省级市（县）编码，表示市、地区、自治州、盟、直辖市所辖市辖区、县汇总码、省（自治区）直辖县级行政区划汇总码。
#     01~20、51~70表示市，直辖市则01表示市区，02以后表示直辖市辖区内的郊县；
#     21~50表示地区、自治州、盟；
#     90表示省（自治区）直辖县级行政区划汇总码。
#   第5、6位数字：所在地级县（市）编码，表示县、自治县、县级市、旗、自治旗、市辖区、林区、特区。
#     01~20表示市辖区、地区（自治州、盟）辖县级市、市辖特区以及省（自治区）直辖县级行政区划中的县级市，01通常表示辖区汇总码；
#     21~80表示县、自治县、旗、自治旗、林区、地区辖特区；
#     81~99表示省（自治区）辖县级市。
# 字母代码的编制原则和结构
#   行政区划字母代码(简称字母码)遵循科学性、统一性、实用性编码原则，参照县及县以上行政区划名称的罗马字母拼写，取相应的字母编制。
#   省、自治区、直辖市、特别行政区的字母码用两位大写字母表示。
#   市、地区、自治州、盟、县、自治县、县级市、旗、自治旗、市辖区、林区、特区的字母码用三位大写字母表示。

module Unidom
  module Geo
    module China

      class Region < ApplicationRecord

        # MDUCG = MUNICIPALITY DIRECT UNDER CENTRAL GOVERNMENT
        MDUCG_CODES = [ '11', '12', '31', '50' ].freeze

        self.table_name = 'unidom_china_regions'

        include Unidom::Common::Concerns::ModelExtension
        include Unidom::Geo::Concerns::AsRegion
        include Unidom::Geo::China::Concerns::AsInferiorRegion
        include Unidom::Geo::China::Concerns::AsSuperiorRegion

        validates :numeric_code,    presence:     true, numericality: { integer_only: true, greater_than_or_equal_to: 0 }, length: { minimum: columns_hash['numeric_code'].limit }
        validates :alphabetic_code, allow_blank:  true, length: { minimum: 2 }
        validates :name,            presence:     true, length: { in: 1..self.columns_hash['name'].limit }

        belongs_to :scheme, polymorphic: true

        has_many :towns, class_name: 'Unidom::Geo::China::Town'

        scope :scheme_is,      ->(scheme) { scheme.present? ? where(scheme: scheme) : scheme_id_is.scheme_type_is }
        scope :scheme_id_is,   ->(scheme_id   = Unidom::Common::NULL_UUID) { where scheme_id:   scheme_id   }
        scope :scheme_type_is, ->(scheme_type = ''                       ) { where scheme_type: scheme_type }

        scope :name_is,       ->(name)           { where name:    name    }
        scope :being_virtual, ->(virtual = true) { where virtual: virtual }

        scope :root_level, -> { numeric_code_ending_with '0000' }

        ##
        # 获取行政区划代码的前 2 位数字。
        def numeric_code_prefix
          numeric_code[0..1]
        end

        ##
        # 获取行政区划代码的中间 2 位数字。
        def numeric_code_middle
          numeric_code[2..3]
        end

        ##
        # 获取行政区划代码的后 2 位数字。
        def numeric_code_suffix
          numeric_code[4..5]
        end

        ##
        # 判断行政区划代码的中间 2 位数字是否为 00 。
        def numeric_code_middle_empty?
          '00'==numeric_code_middle
        end

        ##
        # 判断行政区划代码的后 2 位数字是否为 00 。
        def numeric_code_suffix_empty?
          '00'==numeric_code_suffix
        end

        ##
        # 判断一个区县级的行政区划是否是区。
        def district?
          numeric_code_suffix.to_i<20
        end

        ##
        # 判断一个行政区划是否是或者属于直辖市。
        def under_mducg?
          self.class::MDUCG_CODES.include? numeric_code_prefix
        end

        ##
        # 判断一个行政区划是否是直辖市。
        def mducg?
          under_mducg? && numeric_code_middle_empty? && numeric_code_suffix_empty?
        end

        ##
        # 拼写当前行政区划的全称，用指定的分隔符区分。如：
        # region.full_name
        # # or
        # region.full_name ' '
        def full_name(separator = ' ')
          final_name     = self.name
          current_region = self
          count          = 0
          while current_region = current_region.super_regions.first
            count += 1
            final_name = "#{current_region.name}#{separator}#{final_name}" unless current_region.virtual?
            break if count>5
          end
          final_name
        end

        def under?(region)
          return false unless region.numeric_code_prefix==numeric_code_prefix
          return false if     numeric_code_middle_empty?
          return true  if     region.numeric_code_middle_empty?
          numeric_code_suffix_empty? ? false : region.numeric_code_suffix_empty?
        end

      end unless Unidom::Common::Neglection.namespace_neglected? 'Unidom::Geo::China::Region'

    end
  end
end
